package EA.testproblems;
import EA.*;

/**
This testproblem is a simple problem for initial tuning of multimodal 
optimization algorithms. <br><br>

<table border="0" cellpadding="2" cellspacing="0">
<tr bgcolor="#a0a0a0">
  <td colspan="2" valign="top"><b>Problem description</b></td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top" width="200"><b>Name:</b></td>
  <td valign="top">Ursem multimodal 3</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Nickname:</b></td>
  <td valign="top">Rebel powerturbines</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Intended usage:</b></td>
  <td valign="top">Explore the eventually problems with fairly narrow peaks
  with some deep valleys between.</td>
</tr>

<tr>
  <td colspan="2" valign="top">&nbsp;</td>
</tr>
<tr bgcolor="#a0a0a0">
  <td colspan="2" valign="top"><b>Problem details</b></td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Function:</b></td>
  <td valign="top">sin(2.2*pi*x +0.5pi) * ((2 - abs(y))/2) * ((3 - abs(x))/2) +
  <br>
  sin(2.2*pi*y*y +0.5pi) * ((2 - abs(y))/2) * ((2 - abs(x))/2)</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Plots:</b></td>
  <td valign="top"><img src="../../images/testproblems/ursemmultimodal3.gif">&nbsp;&nbsp;
<img src="../../images/testproblems/ursemmultimodal3_contour.gif"></td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Ranges:</b></td>
  <td valign="top">x = [-2.0:2.0]&nbsp;&nbsp;y = [-1.5:1.5] </td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Type:</b></td>
  <td valign="top">Maximization</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>No. of maximas:</b></td>
  <td valign="top">5</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>No. of minimas:</b></td>
  <td valign="top">14</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Optimum radius:</b></td>
  <td valign="top">0.15
</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Optimum descriptions:</b></td>
  <td valign="top">The five maximas are located on the same line as four of the
  minimas, which for the multinational EA causes a lot of migration between
  nations when the genomes are mutated.</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Known optimums:</b></td>
  <td valign="top">
  GMAX(0,0),
  LMAX(-1.783914201,0),
  LMAX(1.783914201,0)
  LMAX(-0.8892858287,0),
  LMAX{0.8892858287,0),
  LMIN(-1.136363636,0},{1.136363636,0),
  LMIN(-0.45454545,0},{0.45454545,0}) 
  LMIN(-1.339015318,-0.6424482657),
  LMIN(-1.339015318,0.6424482657),
  LMIN{1.339015318,-0.6424482657),
  LMIN(1.339015318,0.6424482657),
  LMIN(-0.4383729957,-1.15561605),
  LMIN(-0.4383729957,1.15561605),
  LMIN(0.4383729957,-1.15561605),
  LMIN(0.4383729957,1.15561605),
  LMIN(-0.43840889574, -0.6505535758),
  LMIN(-0.43840889574, 0.6505535758),
  LMIN(0.43840889574, -0.6505535758),
  LMIN(0.43840889574, 0.650553575)

<br><font size=1>Capital letters 
means that the precise optimum is known, lowercase letters is the best known 
so far.</font></td>
</tr>
<tr>
  <td colspan="2" valign="top">&nbsp;</td>
</tr>
<tr bgcolor="#a0a0a0">
  <td colspan="2" valign="top"><b>Plotting details</b></td>
</tr>

<tr bgcolor="#e0e0e0">
  <td valign="top"><b>GNUPlot code:</b></td>
  <td valign="top">
  set hidden3d<br>
  set isosamples 40<br>
  set view 70,15<br>
 splot [-2:2] [-1.5:1.5] (sin(2.2*pi*x + 0.5*pi)*((2 - abs(y))/2)*((3 - abs(x))/2) + sin(0.5*pi*y*y + 0.5*pi)*((2 - abs(y))/2)*((2 - abs(x))/2))</td>
</tr>

</table>

*/
public class UrsemMultimodal3 extends NumericalProblem
{
  // Easier way to build max
  private double[][] lmax = {{-1.783914201,0},{-0.8892858287,0},{0,0},
			     {1.783914201,0},{0.8892858287,0}};
  private double[][] lmin = {{-1.136363636,0},{1.136363636,0},
			     {-0.45454545,0},{0.45454545,0}, 
			     {-1.339015318,-0.6424482657},
			     {-1.339015318,0.6424482657},
			     {1.339015318,-0.6424482657}, 
			     {1.339015318,0.6424482657},
			     {-0.4383729957,-1.15561605},
			     {-0.4383729957,1.15561605},
			     {0.4383729957,-1.15561605},
			     {0.4383729957,1.15561605},
			     {-0.43840889574, -0.6505535758},
			     {-0.43840889574, 0.6505535758},
			     {0.43840889574, -0.6505535758},
			     {0.43840889574, 0.6505535758}};

  public UrsemMultimodal3()
    {
      super();

      double[] optimums;

      name = "Ursem Multimodal 3";
      objectivefunction = new NumericalFitness(){
	      public double Fitness_calcFitness_inner(double[] realpos)
	      {
		  return (Math.sin(2.2*Math.PI*realpos[0] + 0.5*Math.PI)*((2 - Math.abs(realpos[1]))/2)*((3 - Math.abs(realpos[0]))/2) + Math.sin(0.5*Math.PI*realpos[1]*realpos[1] + 0.5*Math.PI)*((2 - Math.abs(realpos[1]))/2)*((2 - Math.abs(realpos[0]))/2));
	      };
	  };

      dimensions = 2;
      ismaximization = true;
      optimumradius = 0.15;

      intervals = new Interval[2];
      intervals[0] = new Interval(-2,2);
      intervals[1] = new Interval(-1.5,1.5);
      // Set up known maximas
      knownmaxima = new NumericalOptimum[lmax.length];

      for (int i=0;i<lmax.length;i++) {
	optimums = new double[dimensions];
	optimums[0] = lmax[i][0];
	optimums[1] = lmax[i][1];
	knownmaxima[i] = new NumericalOptimum(optimums, objectivefunction.calcFitness(optimums), true, false, i);
      }

      // Set up known minimas
      knownminima = new NumericalOptimum[lmin.length];

      for (int i=0;i<lmin.length;i++) {
	optimums = new double[dimensions];
	optimums[0] = lmin[i][0];
	optimums[1] = lmin[i][1];
	knownminima[i] = new NumericalOptimum(optimums, objectivefunction.calcFitness(optimums), false, false, i);
      }
    }
  
}
